//对于axios函数库进行二次封装
/* 
封装的目的
    1.利用axios请求、响应拦截器功能
    2.请求拦截器，一般在请求头中携带公共的参数：token
    3.相应拦截器，可以简化服务器返回的数据，处理http的网络错误
*/
import axios from 'axios'
// 引入用户相关的仓库
import useUserStore from '@/store/modules/user'
import { ElMessage } from 'element-plus'
import router from '@/router'

// 利用axios.create方法创建一个axios实例：可以设置基础路径、超时的时间设置
const request = axios.create({
    baseURL: "/api", //请求的基础路径
    timeout: 5000,//超时的时间设置，超出5秒请求就是失败
})
// 请求拦截器
request.interceptors.request.use(config => {
    // 获取用户仓库
    let userStore = useUserStore()
    // token是公共参数，如果用户登录了，需要携带
    if (userStore.userInfo.token) {
        config.headers.token = userStore.userInfo.token
    }
    // config：请求拦截器回调注入的对象（配置对象），配置对象的身上最重要的一件事情headers属性
    // 可以通过请求头携带公共参数-token
    return config
})
// 响应拦截器
request.interceptors.response.use(
    response => {
        // router.push({
        //     path: 'error'
        // })
        // 响应拦截器成功的回调，一般会进行简化数据
        return response.data;
        // return response;
    },
    error => {

        // 处理http网络错误
        let status = error.response.status
        switch (status) {
            case 404:
                ElMessage({
                    type: 'error',
                    message: error.message
                })
                break;
            case 500 | 501 | 502 | 503 | 504 | 505:
                ElMessage({
                    type: 'error',
                    message: error.message
                })
                break;
            default:
                break;
        }
        return Promise.reject(new Error(error.message))
    }
)

// 对外暴露axios
export default request